// 加载模块
const express = require('express')
const http = require('http')
const body_parser = require('body-parser') // 此模块用来获取post提交的数据
const session = require('express-session') // 生成session
const morgan = require('morgan') // 日志包
const cors = require('cors') // 跨域解决包
const errorHandler = require('./middleware/errorhandler') // 统一处理错误中间件
const socketio = require('socket.io') // 加载socket
const router = require('./routers') // 载入路由
const port = process.env.PORT || 3000

// 创建服务
const app = express()
const httpServer = http.createServer(app)
const io = socketio(httpServer, {
  cors: {
    origin: '*' // 设置跨域，也可以设置成你前台访问地址如：http://localhost:8080/
  }
})
app
  .use(morgan('dev')) // 日志输出
  .use(cors()) // 解决跨域，也可以在前端中设置代理服务器，后台解决为优
  .use(body_parser.json()) // 配置中间件body-parser 获取post提交数据
  .use(body_parser.urlencoded({ extended: false }))
  // 第一个参数为访问路径，第二个参数未开放文件路径访问public里的xxx文件即为localhost/public/xxx
  // 第一个参数如果省略则为localhost/xxx
  .use('/public/', express.static('./public/')) // 公开访问路径,引用css之类的使用
  .use(
    session({
      // 配置session
      secret: 'vue',
      resave: false,
      saveUninitialized: false
    })
  )

  // 配置路由
  .use(router)

  // 统一处理错误
  .use(errorHandler())
io.on('connection', (socket) => {
  // 给客户端返回消息，客户端要监听这个事件
  socket.emit('message', '你好', (response) => {
    console.log(response)
  })
  // 新连接
  socket.broadcast.emit('message', '有人链接')
  // 断开连接
  socket.on('disconnect', () => {
    io.emit('message', '有人离开')
  })
})
httpServer.listen(port, () => {
  console.log('running!')
})
